﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//音乐管理类，继承单例类  
public class MusicMgr : MonoSingleton<MusicMgr>
{
    // 用于播放背景音乐的音乐源  
    private AudioSource m_bgMusic;

    // 用于播放音效的音乐源  
    private AudioSource m_effectMusic;

    // 控制背景音乐音量大小  
    public float BgVolume
    {
        get
        {
            return m_bgMusic.volume;
        }
        set
        {
            m_bgMusic.volume = value;
        }
    }
    //控制音效音量的大小  
    public float EffectVolmue
    {
        get
        {
            return m_effectMusic.volume;
        }
        set
        {
            m_effectMusic.volume = value;
        }
    }

    //重写虚方法  
    protected override void Awake()
    {
        base.Awake();
        //实例化音乐源  
        m_bgMusic = gameObject.AddComponent<AudioSource>();
        m_bgMusic.loop = true;    //开启循环  
        m_bgMusic.playOnAwake = false;        //开始播放  

        //实例化音乐源  
        m_effectMusic = gameObject.AddComponent<AudioSource>();
        m_effectMusic.loop = true;
        m_effectMusic.playOnAwake = false;
    }

    // 播放背景音乐，传进一个音频剪辑的name  
    private void PlayBgBase(object bgName, bool restart = false)
    {
        //定义一个空的字符串  
        string curBgName = string.Empty;
        //如果这个音乐源的音频剪辑不为空的话  
        if (m_bgMusic.clip != null)
        {
            //得到这个音频剪辑的name  
            curBgName = m_bgMusic.clip.name;
        }

        // 根据用户的音频片段名称, 找到AuioClip, 然后播放,  
        //ResourcesMgr是提前定义好的查找音频剪辑对应路径的单例脚本，并动态加载出来  
        AudioClip clip = ResourcesMgr.Instance.Load<AudioClip>(bgName);
        //如果找到了，不为空  
        if (clip != null)
        {
            //如果这个音频剪辑已经复制给类音频源，切正在播放，那么直接跳出  
            if (clip.name == curBgName && !restart)
            {
                return;
            }
            //否则，把改音频剪辑赋值给音频源，然后播放  
            m_bgMusic.clip = clip;
            m_bgMusic.Play();
        }
        else
        {
            //没找到直接报错  
            // 异常, 调用写日志的工具类.  
            UnityEngine.Debug.Log("没有找到音频片段");
        }
    }

    //播放各种音频剪辑的调用方法，MusicType是提前写好的存放各种音乐名称的枚举类，便于外面直接调用  
    public void PlayBg(MusicType.BGMusic bgName, bool restart = false)
    {
        PlayBgBase(bgName, restart);
    }

    public void PlayBg(MusicType.Dialog bgName, bool restart = false)
    {
        PlayBgBase(bgName, restart);
    }

    public void PlayBg(MusicType.Effect bgName, bool restart = false)
    {
        PlayBgBase(bgName, restart);
    }



    // 播放音效  
    private void PlayEffectBase(object effectName, bool defAudio = true, float volume = 1f)
    {
        //根据查找路径加载对应的音频剪辑  
        AudioClip clip = ResourcesMgr.Instance.Load<AudioClip>(effectName);
        //如果为空的画，直接报错，然后跳出  
        if (clip == null)
        {
            UnityEngine.Debug.Log("没有找到音效片段");
            return;
        }
        //否则，就是clip不为空的话，如果defAudio=true，直接播放  
        if (defAudio)
        {
            //PlayOneShot (音频剪辑, 音量大小)  
            m_effectMusic.PlayOneShot(clip, volume);
        }
        else
        {
            //指定点播放  
            AudioSource.PlayClipAtPoint(clip, Camera.main.transform.position, volume);
        }
    }

    //播放各种音频剪辑的调用方法，MusicType是提前写好的存放各种音乐名称的枚举类，便于外面直接调用  
    public void PlayEffect(MusicType.BGMusic effectName, bool defAudio = true, float volume = 1f)
    {
        PlayEffectBase(effectName, defAudio, volume);
    }

    public void PlayEffect(MusicType.Dialog effectName, bool defAudio = true, float volume = 1f)
    {
        PlayEffectBase(effectName, defAudio, volume);
    }

    public void PlayEffect(MusicType.Effect effectName, bool defAudio = true, float volume = 1f)
    {
        PlayEffectBase(effectName, defAudio, volume);
    }

}